
/* $Id: edilana.c 8 2009-12-27 16:54:50Z calicant $ */

#include "edilana.h"

char    NOMECANDI [MAXSTRLEN],
    NOMERESTO [MAXSTRLEN],
    NOMEANAGS[MAXSTRLEN],
    NOMENOMIB [MAXSTRLEN],
    ALTRECANDI[MAXSTRLEN],
    ALTRORESTO[MAXSTRLEN],
    ALIASCANDI[MAXSTRLEN],
    TEMPFILE  [MAXSTRLEN],
    LemmaCandy[MAXSTRLEN];

struct Setup predefiniti = {
    "",     /* tempdir */
    NOMELOG,
    VOCABOLARIO,
    LISTANOMI,
    VOCABNOMI,
    ALTROVOCAB,
    LEMMARIO,
    "*:^)&!@~[]/+=\\<?._|>,;#%$(",
    34,     /* colore prompt */
    1,      /* promptora */
    34,     /* colore resto */
    NUMCOLONNE, /* colonne */
    NUMRIGHE,   /* righe */
    AUTO_P,     /* modor */
    1,      /* datalog */
    0,      /* random */
    "",     /* nome cognome */
    0,      /* nome cognome on | off */
    1,      /* minlenw */
    3,      /* minlencandy */
    1,      /* truncandy */
    0,      /* autofusione */
    1,      /* stampacandy */
    0,      /* autocandy */
    "",     /* configfile */
    0,      /* configflag */
    "sort",     /* sort command */
    "uniq",     /* uniq command */
    "cat",      /* cat command */
    "an"        /* anag command */
};

struct Setup *conf;
struct Catalog *catalog;

int main(int argc, char *argv[])
{
/*char   com[] = "*:^)&!@~[]/+=\\<?._|>,;#%$(";*/

char    com[MAXSTRLEN];

int     tab [NUMALFA], tab2[NUMALFA], i;

int OraEntrata[6], OraUscita[6], stat[4] = {0, 1, 0, 0};

int Lungh, Candi, Maxls, Maxlemm = 0,
    Maxln = 0, Nuove = 0, Nomi = 0, ContaAnag[5] = {0, 0, 0, 0, 0};

int Fissa = OFF, Resto = OFF, Error = OFF;

char    sott [MAXSTRLEN],
    srest[MAXSTRLEN],
    sfixw[MAXSTRLEN],
    sundo[MAXSTRLEN] = "",
    slast[MAXSTRLEN] = "",
    stemp[MAXSTRLEN];

struct FirmaNome *np[MAXNOMI];

    #ifdef PASSWORD
    if (TestaPassword(argv[argc-1]))
        argc--;
    else exit(0);
    #endif


	#ifdef AMIGA
        catalog = ILocale->OpenCatalog (NULL, "edilana.catalog", OC_BuiltInLanguage, "english", OC_BuiltInCodeSet, 4, /* = ISO-8859-1 */ TAG_END);
        if (!catalog) {
			// printf ("Could not find catalog.\n");
		}
	#endif

    DataOra(OraEntrata);

    conf = &predefiniti;

    strcpy(com, conf->comando);

    Maxls = Incipit(argc,argv,com,tab,
        &Lungh,&Candi,np,ContaAnag,&Nomi);

    if (OraEntrata[0] > 8 && OraEntrata[1] == 12)
        StampaAuguri();

    if (conf->autocandy)
        goto setcandycom;

for (;;) {

    if (Resto == ON)
        i = LineEdit(sott,NOMERESTO,0);
    else
        i = LineEdit(sott,NOMECANDI,0);
    if (i) {
        IoDico(i);
        Uscita(0);
        return 0;
    }

    stat[2]++;
    stemp[0] = '\0';

    if (*sott == ' ') *sott = com[AGGIUNGI];

    WildCandi(sott, com[WILD_CANDI], com[WILD_RESTO], Resto);

    if (*sott == com[ANAG_IN_LOG]) {
        if (sott[1] != ' ')
            IoDico(COMANDO_ERRATO);
        else {
            anain:
            strcpy(sundo,slast);
            strcpy(slast,sott);
            i = Sottraz(tab,sott,srest,Lungh,ON);
            if (strlen(srest) == 0 && !i) {
                if(!InsertLog(conf->nomecognome,slast,conf->logfile,conf->datalog))
                    ContaAnag[4]++;
                ContaAnag[1]++;
                Resto = OFF;
            }
            Stripnl(slast);
        }
        continue;
    }
    else if (*sott == com[FISSA_LEMMA]) {
        if (sott[1] == '-')
            Fissa = OFF;
        else if (AbbastanzaLunga(sott,1)) {
            if (Sottraz(tab,sott,srest,Lungh,ON))
                continue;
            Fissa = ON;
            strcpy(sfixw,sott);
            strcpy(slast,sott);
        }
            continue;
    }
    else if (*sott == com[AGGIUNGI] || *sott == com[TOGLI]
        || *sott == com[SOSTITUISCI]) {

        if (i = AggiungiTogli(slast,sott,Fissa,sfixw,com)) {
                        IoDico(i);
            continue;
        }
        if (*slast == '=') {
            strcat(sott,"\n");
            goto anain;
        }
                *stemp = '[';
    }
    else if (*sott == com[UNDO]) {
        strcpy(sott,sundo);
        *stemp = '[';
    }
    else if (*sott == com[VEDI_CAND]) {
        if (i = VediCandidate(sott, tab, Resto, Lungh, Maxls))
            IoDico(i);
        if (!i) Resto = OFF;
        continue;
    }
    else if (*sott == com[CANDY]) {
        autocandy:
        if (i = Candy(sott, srest, Resto, Lungh, tab, 
            LemmaCandy, &Maxlemm, &Maxls))
            if (i > 0) IoDico(i);
        continue;
    }
    else if (*sott == com[AUTO_ANAG]) {
        AutoAnagrammi(sott, Lungh);
        continue;   
    }
    else if (*sott == com[CMD_EXT]) {
        system(&sott[1]);
        continue;
    }
    else if (*sott == com[SUL_RESTO]) {
        if (Resto != ON) IoDico(NON_RESTO);
        else  if (i = GiocaSulResto(sott, srest, tab))
            IoDico(i);
        continue;
    }
    else if (*sott == com[ANAGRAMMA]) {
        if (i = CalcAnagrammi(tab, sott, Resto, srest,
            Lungh))
            IoDico(i);
        continue;
    }
    else if (*sott == com[NOMI_BUONI]) {
        if (sott[1] == com[NOMI_BUONI] && Maxln)
            StampaCol(NOMENOMIB,1,tab,Maxln+3,OFF,OFF,sott);
        else Maxln = NomiBuoni(sott,np,Nomi);
        continue;
    }
    else if (*sott == com[LISTA_NOMI]) {
        if (UsaListaNomi(np, &Nomi, sott, com))
            goto nuovabase;
        continue;
    }
    else if (*sott == com[AUTO_RESTO]) {
        if (sott[1] == '-') conf->modor = OFF;
        else if (sott[1] == 'r') conf->modor = AUTO_R;
        else if (sott[1] == 's') conf->modor = AUTO_S;
        else if (sott[1] == 'p') conf->modor = AUTO_P;
        else if (sott[1] == 'd')
            conf->datalog = !conf->datalog;
        else if (sott[1] == 'h')
            conf->promptora = !conf->promptora;
        else if (sott[1] == 'c')
            conf->autocandy = !conf->autocandy;
        else if (sott[1] == 'f') {
            if (Resto == ON && strlen(srest) < 7)
                Permuta(srest);
        }
        else IoDico(COMANDO_ERRATO);
        continue;
    }
    else if (*sott == com[NUOVA_BASE]) {
        nuovabase:
        Maxlemm = 0;
        if (strchr(sott,' ') == NULL) {
            IoDico(NOME_COGNOME);
            continue;
        }
        else if (AbbastanzaLunga(sott,5)) {
            if (strlen(&sott[1]) > MAXLNOME + 1) {
                IoDico(NOME_LUNGO);
                continue;
            }
            strcpy(conf->nomecognome,&sott[1]);
            Stripnl(conf->nomecognome);
            Lungh = StringaBase(sott,tab);
            ContaAnag[0] += ContaAnag[1];
            stat[1]++;
            ContaAnag[1] = 0;
            strcpy(slast,"");
            strcpy(sundo,"");
            printf(" *** per \"%s\"", conf->nomecognome);
            sott[0] = com[NUOVA_BASE];
            goto voc;
        }
    }
    else if (*sott == com[NUOVO_LOG]) {
        if (!AbbastanzaLunga(sott,1))
            continue;
        if (sott[1] == com[NUOVO_LOG]) {
            strcpy(conf->logfile,&sott[2]);
            SettaLogfile(conf->logfile,ContaAnag);
            stat[0] += ContaAnag[0] + ContaAnag[1];
            stat[3] += ContaAnag[4];
        }
        else {
            i = Stripnl(sott);
            if (i < 5 || (i > 4 && sott[i-4] != '.'))
                strcat(sott,".ana");
            sprintf(stemp,"%c\n",com[VEDI_IN_LOG]);
            MostrAnaInLog(&sott[1],stemp,conf->nomecognome);

        }
        continue;
    }
    else if (*sott == com[NUOVO_VOC]) {
        if (AbbastanzaLunga(sott,1)) {
            strcpy(conf->vocabolario,&sott[1]);
            printf(" *** ");
            voc:
            i = CercaCandidate(tab,conf->vocabolario,NOMECANDI,&Maxls,ON);
            if (i > 0) {
                StampaCol(NOMECANDI,conf->minlenw,tab2,Maxls,
                    OFF,OFF,sott);
                Candi = i;
            }
            if (*sott == com[NUOVA_BASE] && conf->autocandy) {
                setcandycom:
                sott[0] = com[CANDY];
                sott[1] = *sott;
                sott[2] = *sott;
                sott[3] = '\n';
                goto autocandy;
            }
            Fissa = OFF;
            Resto = OFF;            
        }
        continue;
    }
    else if (*sott == com[NUOVO_LEMMA]) {
        if (isalpha(sott[1])) i = ON;
        else if (sott[1] == com[NUOVO_LEMMA]) i = OFF;
        else {
            IoDico(COMANDO_ERRATO);
            continue;
        }
        if (AbbastanzaLunga(sott,3)) {
            Pulisci(sott);
            if (!InsTogliVocab(conf->vocabolario,sott,i) && i)
                Nuove++;
        }
        continue;
    }
    else if (*sott == com[VEDI_IN_LOG]) {
        MostrAnaInLog(conf->logfile,sott,conf->nomecognome);
        if (*sott == conf->comando[NUOVA_BASE])
            goto nuovabase;
        continue;
    }
    else if (*sott == com[VEDI_VAR]) {
        StampaVarProg(Resto, srest, Error, slast, Fissa,
        conf->minlenw, Candi, Nuove, ContaAnag, Nomi);
        continue;
    }
    else if (*sott == com[AIUTO]) {
        Help(sott, com);
        continue;
    }
    else if (*sott == com[COMMENTO_LOG]) {
        CommentoInLog(sott,conf->logfile);
        continue;
    }
    else if (*sott == com[WILD_CANDI] || *sott == com[WILD_RESTO])
        continue;
    else if (*sott == com[USCITA]) {
        if (sott[1] == com[USCITA]) {
            DataOra(OraUscita);
            stat[0] += ContaAnag[0] + ContaAnag[1];
            stat[3] += ContaAnag[4];
            Statistiche(OraEntrata,OraUscita,stat);
        }
        Uscita(0);
        return 0;
    }
    else if (!isalpha(*sott)) {
        if (*sott != '\n')
            IoDico(NON_CONOSCO);
        continue;
    }

    Stripnl(sott);

    if (Fissa == ON && *stemp != '[') {
        strcat(sott," ");
        strcat(sott,sfixw);
    }
    strcpy(sundo,slast);
    strcpy(slast,sott);
    Resto = ON;

    if (Error = Sottraz(tab,sott,srest,Lungh,ON))
        Resto = OFF;

    if ((i = strlen(srest)) == Lungh || i < 3)
        Resto = OFF;

    if (conf->modor != OFF && Resto == ON) {
        StringaBase(srest,tab2);
        if (CercaCandidate(tab2,NOMECANDI,NOMERESTO,&i,OFF) > 0) {
            if (conf->modor != AUTO_R)
                i = strlen(srest)+1;
            StampaCol(NOMERESTO,conf->minlenw,tab2,i,conf->modor > AUTO_R,
                OFF,sott);
        }
        else if (conf->modor == AUTO_P && (i = strlen(srest)) < 6)
            Permuta(srest);
    }

}

return 0;
}
